package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	multiplicationTable()
	randomSumAndProduct(20, 20)
	fibonacci(100)
}

// 九九乘法表
func multiplicationTable() {
	for i := 1; i <= 9; i++ {
		// 这里j的循环条件可以改成j<=i,时间复杂度更低，效率更好
		for j := 1; j <= 9; j++ {
			if j <= i {
				fmt.Printf("%[2]v*%[1]v=%-3[3]v", i, j, i*j)
			}
		}
		fmt.Println() // 换行
	}
}

// WAYNE: 九九乘法表 v2
func multiplicationTableV2() {
	for i := 1; i <= 9; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%[2]v*%[1]v=%-3[3]v", i, j, i*j)
		}
		fmt.Println() // 换行
	}
}

// 随机数求和与积
// 随机生成20以内的20个非0正整数，打印出来。对生成的数值，第单数个（不是索引）累加求和，第偶数个累乘求积
func randomSumAndProduct(max int, count int) (int, int) {
	src := rand.New(rand.NewSource(time.Now().UnixNano())) // 使用当前纳秒作为随机数种子
	r := rand.New(src)                                     // 随机数生成器

	var (
		sum          = 0
		sumSlice     = []int{}
		product      = 1
		productSlice = []int{}
	)
	for i := 1; i <= count; i++ { // wayne: 这个是个数
		num := r.Intn(max) + 1 // wayne: 这个范围最好不要和count共用一个变量
		if i%2 != 0 {
			sumSlice = append(sumSlice, num)
			sum += num // 单数累加
		} else {
			// 偶数乘积
			product *= num
			productSlice = append(productSlice, num)
		}
	}

	fmt.Printf("sumSlice: %v => sum:%v, product:%v => product:%v\r\n", sumSlice, sum, productSlice, product)

	return sum, product
}

// 打印100以内的斐波那契数列
func fibonacci(max int) (r []int) {

	a, b := 1, 1
	r = append(r, a, b)
	for {
		a, b = b, a+b
		if b > max {
			break
		}
		r = append(r, b)
	}

	fmt.Println("fibonacci:", r)
	return r
}

// wayne： 完成的非常好，用函数封装，清晰明了
